﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Metriks.Parsiranje.Klase
{
    public class beginFunction : LOC, Renameable
    {
        public enum Tip
        {
            blank,
            integer,
            real
        }

        public String Naziv {get;set;}
        public List<Varijabla> Parametri {get;set;}
        public Tip PovratniTip { get; set; }

        public beginFunction(String[] parametri)
        {
            Parametri = new List<Varijabla>();
            int i = 0;
            Naziv = parametri[i];
            for (i = 1; i < parametri.Length - 1; i=i+2)
                Parametri.Add(new Varijabla(parametri[i],parametri[i+1]));
            PovratniTip = string2tip(parametri[i]);
        }

        private Tip string2tip(String s)
        {
            if (s == "void")
                return Tip.blank;
            else if (s == "int")
                return Tip.integer;
            else
                return Tip.real;
        }

        private String tip2string(Tip t)
        {
            if (t == Tip.blank)
                return "void";
            else if (t == Tip.integer)
                return "int";
            else
                return "double";
        }

        public override string ispiši()
        {
            return "function " + Naziv + "(" +varijableUString() + ") returns " + tip2string(PovratniTip);
        }

        private String varijableUString()
        {
            String rezultat = "";
            if (Parametri.Count == 0)
                return rezultat;
            if (Parametri.Count == 1)
                return Parametri[0].ispiši();
            for (int i =0; i < Parametri.Count-1; i++)
            {
                rezultat += (Parametri[i].ispiši() + ", ");
            }
            return rezultat+Parametri[Parametri.Count-1].ispiši();
        }
        public void renameVariable(string oldname, string newname)
        {
            foreach (Varijabla v in Parametri) {
                if (v.Naziv == oldname) v.Naziv = newname;
            }
        }
    }
}
